package models.utilities;
import java.awt.Graphics2D;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Random;
import javax.swing.JOptionPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.text.Anchor;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import controllers.SerializableManager;
import models.Account;
import models.Bank;
import models.Person;
public class AdminReports {
private static Bank bank = new Bank();
private static SerializableManager m = new SerializableManager();
private static String FILE = "C:/Users/Bolo/tema4/Tema4/AdminReports.pdf";
private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
private static double sum = 0;
public AdminReports() {
try {
bank = m.deserializeBank();
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE));
document.open();
addTitlePage(document);
addContent(document, writer);
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("deprecation")
public static JFreeChart generateBarChart(Bank b) {
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
DateFormat df = new SimpleDateFormat("dd/MM/yy");
Iterator<Entry<Person, ArrayList<Account>>> iterator = b.getContent().entrySet().iterator();
while (iterator.hasNext()) {
Entry<Person, ArrayList<Account>> entry = iterator.next();
for (int i = 0; i < entry.getValue().size(); i++) {
try {
dataSet.setValue(
df.parse(entry.getValue().get(i).getCloseDate()).getYear()
- df.parse(entry.getValue().get(i).getDate()).getYear(),
"Year", String.valueOf(entry.getValue().get(i).getId()));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
JFreeChart chart = ChartFactory.createBarChart("Account valability", "AccountId", "Year", dataSet,
PlotOrientation.VERTICAL, false, true, false);
return chart;
}
public static void writeChartToPDF(Document document, JFreeChart chart, int width, int height, PdfWriter writer) {
try {
PdfContentByte contentByte = writer.getDirectContent();
PdfTemplate template = contentByte.createTemplate(width, height);
@SuppressWarnings("deprecation")
Graphics2D graphics2d = template.createGraphics(width, height, new DefaultFontMapper());
java.awt.geom.Rectangle2D rectangle2d = new java.awt.geom.Rectangle2D.Double(0, 0, width, height);
chart.draw(graphics2d, rectangle2d);
graphics2d.dispose();
contentByte.addTemplate(template, 0, 0);
} catch (Exception e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Report generated!");
}
public static void addTitlePage(Document document) throws DocumentException {
Paragraph preface = new Paragraph();
addEmptyLine(preface, 1);
preface.add(new Paragraph("Generated report for admin", catFont));
addEmptyLine(preface, 1);
preface.add(new Paragraph("Report generated by: admin, " + new Date(), smallBold));
addEmptyLine(preface, 3);
preface.add(new Paragraph("This document describes the operations made on each account", smallBold));
addEmptyLine(preface, 8);
document.add(preface);
document.newPage();
}
public static void addContent(Document document, PdfWriter writer) throws DocumentException {
Anchor anchor = new Anchor("Deposits", catFont);
anchor.setName("Deposits");
Random rand = new Random();
Paragraph para = new Paragraph(anchor);
addEmptyLine(para, 1);
createTable(para);
addEmptyLine(para, 1);
createPersonTable(para);
addEmptyLine(para, 1);
para.add(new Paragraph("The amount of money from deposits: " + sum, smallBold));
addEmptyLine(para, 1);
para.add(new Paragraph("The total number of accounts is: " + bank.getNumberOfAccounts(), smallBold));
addEmptyLine(para, 1);
para.add(new Paragraph("The total number of persons is: " + bank.getNumberOfPersons(), smallBold));
addEmptyLine(para, 1);
para.add(new Paragraph("Interest rate: 0.1. Next increase will be done in " + (rand.nextInt(10) + 1)
+ " months with " + (rand.nextInt(5) + 1) + "%", smallBold));
addEmptyLine(para, 1);
para.add(new Paragraph("Gain rate: 0.1. Next increase will be done in " + (rand.nextInt(10) + 1)
+ " months with " + (rand.nextInt(2) + 1) + "%", smallBold));
addEmptyLine(para, 2);
writeChartToPDF(document, generateBarChart(bank), 400, 300, writer);
document.add(para);
}
public static void createTable(Paragraph subCatPart) throws BadElementException {
PdfPTable table = new PdfPTable(7);
PdfPCell c1 = new PdfPCell(new Phrase("ID"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Person"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("AccountID"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Sum"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Type"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Open Date"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Closing Date"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
table.setHeaderRows(1);
Iterator<Entry<Person, ArrayList<Account>>> iterator = bank.getContent().entrySet().iterator();
while (iterator.hasNext()) {
Entry<Person, ArrayList<Account>> entry = iterator.next();
for (int i = 0; i < entry.getValue().size(); i++) {
sum += entry.getValue().get(i).getSum();
PdfPCell cell1 = new PdfPCell(new Paragraph(String.valueOf(entry.getKey().getId())));
PdfPCell cell2 = new PdfPCell(new Paragraph(entry.getKey().getName()));
PdfPCell cell3 = new PdfPCell(new Paragraph(String.valueOf(entry.getValue().get(i).getId())));
PdfPCell cell4 = new PdfPCell(new Paragraph(String.valueOf(entry.getValue().get(i).getSum())));
PdfPCell cell5 = new PdfPCell(new Paragraph(entry.getValue().get(i).getType()));
PdfPCell cell6 = new PdfPCell(new Paragraph(entry.getValue().get(i).getDate()));
PdfPCell cell7 = new PdfPCell(new Paragraph(entry.getValue().get(i).getCloseDate()));
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
table.addCell(cell4);
table.addCell(cell5);
table.addCell(cell6);
table.addCell(cell7);
}
}
subCatPart.add(table);
}
public static void createPersonTable(Paragraph subCatPart) throws BadElementException {
PdfPTable table = new PdfPTable(2);
PdfPCell c1 = new PdfPCell(new Phrase("ID"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Person"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
table.setHeaderRows(1);
Iterator<Entry<Person, ArrayList<Account>>> iterator = bank.getContent().entrySet().iterator();
while (iterator.hasNext()) {
Entry<Person, ArrayList<Account>> entry = iterator.next();
PdfPCell cell1 = new PdfPCell(new Paragraph(String.valueOf(entry.getKey().getId())));
PdfPCell cell2 = new PdfPCell(new Paragraph(entry.getKey().getName()));
table.addCell(cell1);
table.addCell(cell2);
}
subCatPart.add(table);
}
public static void addEmptyLine(Paragraph paragraph, int number) {
for (int i = 0; i < number; i++) {
paragraph.add(new Paragraph(" "));
}
}
}